home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 37 / IOPROG_37.ISO / SOFT / Multilizer.exe / disk1 / data1.cab / data1 / [Group9]VCL Source Standard / ivdbmult.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-08-12  |  12.2 KB  |  465 lines

  1. unit IvDBMult;
  2.  
  3. {$I IVMULTI.INC}
  4.  
  5. interface
  6.  
  7. uses
  8. {$IFDEF WIN32}
  9.   Windows,
  10. {$ELSE}
  11.   WinTypes, WinProcs,
  12. {$ENDIF}
  13.   Classes, SysUtils, DB, DBTables,
  14.   IvDictio, IvDatDic;
  15.  
  16. type
  17.   EIvInvalidParameter = class(Exception);
  18.  
  19.   TIvDBDictionary = class(TIvCustomDatabaseDictionary)
  20.   private
  21.     FTable: TTable;
  22.  
  23.     function GetDatabaseName: String;
  24.     procedure SetDatabaseName(value: String);
  25.  
  26.     function GetTableType: TTableType;
  27.     procedure SetTableType(value: TTableType);
  28.  
  29.   protected
  30.     function OpenTable(const tableName: String): TTable;
  31.  
  32.     function GetLanguageCount: Integer; override;
  33.     procedure GetLanguageData(index: Integer; language: TIvLanguage); override;
  34.     function GetLocaleCount: Integer; override;
  35.     procedure GetLocaleData(index: Integer; locale: TIvLocale); override;
  36.  
  37.   public
  38.     constructor Create(owner: TComponent); override;
  39.  
  40.     procedure Open; override;
  41.     procedure Close; override;
  42.  
  43.     function TranslateString(
  44.       const str: String;
  45.       var translation: String): Boolean; override;
  46.     function TranslateContextString(
  47.       const str, form, component: String;
  48.       var translation: String): Boolean; override;
  49.  
  50.     procedure GetLanguageDatas(list: TList); override;
  51.  
  52.     class function LanguageFromDataset(
  53.       language: TIvLanguage;
  54.       dataset: TDataset): Boolean;
  55.     class function LocaleFromDataset(
  56.       locale: TIvLocale;
  57.       dataset: TDataset): Boolean;
  58.  
  59.     class function GetContextType(
  60.       table: TTable;
  61.       languageCount: Integer): TIvContextType;
  62.  
  63.   published
  64.     property DatabaseName: String read GetDatabaseName write SetDatabaseName;
  65.     property TableType: TTableType read GetTableType write SetTableType default ttDefault;
  66.   end;
  67.  
  68. implementation
  69.  
  70. constructor TIvDBDictionary.Create(owner: TComponent);
  71. begin
  72.   inherited Create(owner);
  73.   FTable := TTable.Create(Self);
  74. end;
  75.  
  76. class function TIvDBDictionary.GetContextType(
  77.   table: TTable;
  78.   languageCount: Integer): TIvContextType;
  79. begin
  80.   if table.FieldCount = languageCount + 1 then
  81.     Result := [ivctForm]
  82.   else if table.FieldCount > languageCount + 1 then
  83.     Result := [ivctForm, ivctComponent]
  84.   else
  85.     Result := [];
  86. end;
  87.  
  88. function TIvDBDictionary.GetDatabaseName: String;
  89. begin
  90.   Result := FTable.DatabaseName;
  91. end;
  92.  
  93. procedure TIvDBDictionary.SetDatabaseName(value: String);
  94. begin
  95.   FTable.DatabaseName := value;
  96. end;
  97.  
  98. function TIvDBDictionary.GetTableType: TTableType;
  99. begin
  100.   Result := FTable.TableType;
  101. end;
  102.  
  103. procedure TIvDBDictionary.SetTableType(value: TTableType);
  104. begin
  105.   FTable.TableType := value;
  106. end;
  107.  
  108. function TIvDBDictionary.OpenTable(const tableName: String): TTable;
  109. begin
  110.   Result := TTable.Create(nil);
  111.   try
  112.     Result.DatabaseName := DatabaseName;
  113.     Result.TableName := tableName;
  114.     Result.TableType := TableType;
  115.     Result.Open;
  116.   except
  117.     Result.Free;
  118.     raise;
  119.   end;
  120. end;
  121.  
  122. function TIvDBDictionary.GetLanguageCount: Integer;
  123. var
  124.   table: TTable;
  125. begin
  126.   table := OpenTable(LanguageTableName);
  127.   try
  128.     Result := table.RecordCount;
  129.   finally
  130.     table.Free;
  131.   end;
  132. end;
  133.  
  134. procedure TIvDBDictionary.GetLanguageData(index: Integer; language: TIvLanguage);
  135. var
  136.   i: Integer;
  137.   table: TTable;
  138. begin
  139.   table := OpenTable(LanguageTableName);
  140.   try
  141.     for i := 0 to index - 1 do
  142.       table.Next;
  143.     LanguageFromDataset(language, table);
  144.   finally
  145.     table.Free;
  146.   end;
  147. end;
  148.  
  149. procedure TIvDBDictionary.GetLanguageDatas(list: TList);
  150. var
  151.   table: TTable;
  152.   language: TIvLanguage;
  153. begin
  154.   table := OpenTable(LanguageTableName);
  155.   try
  156.     while not table.EOF do
  157.     begin
  158.       language := TIvLanguage.Create;
  159.       LanguageFromDataset(language, table);
  160.       list.Add(language);
  161.       table.Next;
  162.     end;
  163.   finally
  164.     table.Free;
  165.   end;
  166. end;
  167.  
  168. function TIvDBDictionary.GetLocaleCount: Integer;
  169. var
  170.   table: TTable;
  171. begin
  172.   if LocaleTableName = '' then
  173.     Result := 0
  174.   else
  175.   begin
  176.     table := OpenTable(LocaleTableName);
  177.     try
  178.       Result := table.RecordCount;
  179.     finally
  180.       table.Free;
  181.     end;
  182.   end;
  183. end;
  184.  
  185. procedure TIvDBDictionary.GetLocaleData(index: Integer; locale: TIvLocale);
  186. var
  187.   table: TTable;
  188. begin
  189.   table := OpenTable(LocaleTableName);
  190.   try
  191.     table.MoveBy(index);
  192.     LocaleFromDataset(locale, table);
  193.   finally
  194.     table.Free;
  195.   end;
  196. end;
  197.  
  198. function TIvDBDictionary.TranslateString(
  199.   const str: String;
  200.   var translation: String): Boolean;
  201. begin
  202.   Result := FTable.FindKey([str]);
  203.   if Result then
  204.     translation := FTable.Fields[GetFieldIndex].AsString;
  205. end;
  206.  
  207. function TIvDBDictionary.TranslateContextString(
  208.   const str, form, component: String;
  209.   var translation: String): Boolean;
  210. begin
  211.   if ContextType = [] then
  212.     Result := TranslateString(str, translation)
  213.   else
  214.   begin
  215.     Result := FTable.FindKey([str, form, component]);
  216.     if Result then
  217.       translation := FTable.Fields[GetFieldIndex].AsString;
  218.   end;
  219. end;
  220.  
  221. procedure TIvDBDictionary.Open;
  222. begin
  223.   if IsOpen then
  224.     Exit;
  225.  
  226.   { Open the translation table }
  227.  
  228.   FTable.TableName := TableName;
  229.   if (TableType = ttParadox) or (CompareText(ExtractFileExt(FTable.TableName), '.DB') = 0) then
  230.   begin
  231.     { Paradox tables do not have the index name }
  232.  
  233.     FTable.IndexName := '';
  234.   end
  235.   else
  236.   begin
  237.     { All other names have the index name 'Native' }
  238.  
  239.     FTable.IndexName := INDEX_NAME_C;
  240.   end;
  241.  
  242.   try
  243.     FTable.Open;
  244.   except
  245.     { Might be a paradox table. Tries without the index name. }
  246.  
  247.     FTable.IndexName := '';
  248.     FTable.Open;
  249.   end;
  250.  
  251.   if FTable.IndexFieldCount = 0 then
  252.   begin
  253.     FTable.Close;
  254.     raise EIvNoIndex.Create('No index on the translation table');
  255.   end;
  256.  
  257.   FContextType := GetContextType(FTable, LanguageCount);
  258.  
  259.   inherited Open;
  260. end;
  261.  
  262. procedure TIvDBDictionary.Close;
  263. begin
  264.   FTable.Close;
  265.   inherited Close;
  266. end;
  267.  
  268. class function TIvDBDictionary.LanguageFromDataset(
  269.   language: TIvLanguage;
  270.   dataset: TDataset): Boolean;
  271. begin
  272.   Result := False;
  273.  
  274.   language.Primary := dataset.Fields[LANGUAGE_PRIMARY_C].AsInteger;
  275.   language.AllSubs := dataset.Fields[LANGUAGE_SUBS_C].AsString;
  276.   language.DefaultSub := dataset.Fields[LANGUAGE_DEFAULT_SUB_C].AsInteger;
  277.  
  278. {$IFDEF WIN32}
  279.   if dataset.FieldCount > LANGUAGE_CHARSET_C then
  280.     language.Charset := dataset.Fields[LANGUAGE_CHARSET_C].AsInteger
  281.   else
  282.   begin
  283.     language.Charset := 0;
  284.     Result := True;
  285.   end;
  286. {$ENDIF}
  287.  
  288.   if dataset.FieldCount > LANGUAGE_CODE_PAGE_C then
  289.     language.CodePage := dataset.Fields[LANGUAGE_CODE_PAGE_C].AsInteger
  290.   else
  291.   begin
  292.     language.CodePage := 0;
  293.     Result := True;
  294.   end;
  295.  
  296.   language.EnglishName := dataset.Fields[LANGUAGE_ENGLISH_NAME_C].AsString;
  297.   language.NativeName := dataset.Fields[LANGUAGE_NATIVE_NAME_C].AsString;
  298.  
  299.   if dataset.FieldCount > LANGUAGE_ISO_LANGUAGE_C then
  300.     language.ISOLanguage := dataset.Fields[LANGUAGE_ISO_LANGUAGE_C].AsString
  301.   else
  302.   begin
  303.     language.ISOLanguage := '';
  304.     Result := True;
  305.   end;
  306.  
  307.   if dataset.FieldCount > LANGUAGE_ISO_COUNTRIES_C then
  308.     language.ISOAllCountries := dataset.Fields[LANGUAGE_ISO_COUNTRIES_C].AsString
  309.   else
  310.   begin
  311.     language.ISOAllCountries := '';
  312.     Result := True;
  313.   end;
  314.  
  315.   if dataset.FieldCount > LANGUAGE_ISO_DEFAULT_COUNTRY_C then
  316.     language.ISODefaultCountry := dataset.Fields[LANGUAGE_ISO_DEFAULT_COUNTRY_C].AsString
  317.   else
  318.   begin
  319.     language.ISODefaultCountry := '';
  320.     Result := True;
  321.   end;
  322.  
  323.   if dataset.FieldCount > LANGUAGE_FONT_NAME_C then
  324.     language.FontName := dataset.Fields[LANGUAGE_FONT_NAME_C].AsString
  325.   else
  326.   begin
  327.     language.FontName := '';
  328.     Result := True;
  329.   end;
  330.  
  331.   if dataset.FieldCount > LANGUAGE_FONT_SIZE_C then
  332.     language.FontSize := dataset.Fields[LANGUAGE_FONT_SIZE_C].AsInteger
  333.   else
  334.   begin
  335.     language.FontSize := 0;
  336.     Result := True;
  337.   end;
  338.  
  339.   if dataset.FieldCount > LANGUAGE_OPTIONS_C then
  340.     language.OptionsAsInt := dataset.Fields[LANGUAGE_OPTIONS_C].AsInteger;
  341.  
  342.   language.Init;
  343. end;
  344.  
  345. class function TIvDBDictionary.LocaleFromDataset(
  346.   locale: TIvLocale;
  347.   dataset: TDataset): Boolean;
  348. var
  349.   i: Integer;
  350.  
  351.   function GetChar(index: Integer): Char;
  352.   var
  353.     str: String;
  354.   begin
  355.     str := dataset.Fields[index].AsString;
  356.     if str = '' then
  357.       Result := ' '
  358.     else
  359.       Result := str[1];
  360.   end;
  361.  
  362. begin
  363.   Result := False;
  364.  
  365.   locale.Primary := dataset.Fields[LOCALE_PRIMARY_C].AsInteger;
  366.   locale.Sub := dataset.Fields[LOCALE_SUB_C].AsInteger;
  367.  
  368. {$IFDEF WIN32}
  369.   if dataset.FieldCount > LOCALE_CHARSET_C then
  370.     locale.Charset := dataset.Fields[LOCALE_CHARSET_C].AsInteger
  371.   else
  372.   begin
  373.     locale.Charset := 0;
  374.     Result := True;
  375.   end;
  376. {$ENDIF}
  377.  
  378.   locale.CodePage := dataset.Fields[LOCALE_CODEPAGE_C].AsInteger;
  379.  
  380.   if dataset.FieldCount > LOCALE_ISO_COUNTRY_C then
  381.   begin
  382.     locale.ISOLanguage := dataset.Fields[LOCALE_ISO_LANGUAGE_C].AsString;
  383.     locale.ISOCountry := dataset.Fields[LOCALE_ISO_COUNTRY_C].AsString;
  384.   end
  385.   else
  386.   begin
  387.     locale.ISOLanguage := '';
  388.     locale.ISOCountry := '';
  389.     Result := True;
  390.   end;
  391.  
  392.   if dataset.FieldCount > LOCALE_IS_CUSTOM_C then
  393.     locale.IsCustom := dataset.Fields[LOCALE_IS_CUSTOM_C].AsInteger = 1
  394.   else
  395.   begin
  396.     locale.IsCustom := False;
  397.     Result := True;
  398.   end;
  399.  
  400.   locale.EnglishLanguageName := dataset.Fields[LOCALE_ENGLISH_LANGUAGE_NAME_C].AsString;
  401.   locale.EnglishCountryName := dataset.Fields[LOCALE_ENGLISH_COUNTRY_NAME_C].AsString;
  402.   locale.NativeLanguageName := dataset.Fields[LOCALE_NATIVE_LANGUAGE_NAME_C].AsString;
  403.   locale.NativeCountryName := dataset.Fields[LOCALE_NATIVE_COUNTRY_NAME_C].AsString;
  404.  
  405.   if dataset.FieldCount > LOCALE_WIN16_COUNTRY_NAME_C then
  406.   begin
  407.     locale.Win16LanguageName := dataset.Fields[LOCALE_WIN16_LANGUAGE_NAME_C].AsString;
  408.     locale.Win16CountryName := dataset.Fields[LOCALE_WIN16_COUNTRY_NAME_C].AsString;
  409.   end
  410.   else
  411.   begin
  412.     locale.Win16LanguageName := '';
  413.     locale.Win16CountryName := '';
  414.     Result := True;
  415.   end;
  416.  
  417.   locale.MeasurementSystem := TIvMeasurementSystem(dataset.Fields[LOCALE_MEASUREMENT_SYSTEM_C].AsInteger);
  418.   locale.CurrencyString := dataset.Fields[LOCALE_CURRENCY_STRING_C].AsString;
  419.   locale.CurrencyFormat := TIvCurrencyFormat(dataset.Fields[LOCALE_CURRENCY_FORMAT_C].AsInteger);
  420.   locale.NegCurrFormat := TIvNegativeCurrencyFormat(dataset.Fields[LOCALE_NEG_CURR_FORMAT_C].AsInteger);
  421.   locale.ThousandSeparator := GetChar(LOCALE_THOUSAND_SEPARATOR_C);
  422.   locale.DecimalSeparator := GetChar(LOCALE_DECIMAL_SEPARATOR_C);
  423.   locale.CurrencyDecimals := dataset.Fields[LOCALE_CURRENCY_DECIMALS_C].AsInteger;
  424.  
  425.   locale.DateSeparator := GetChar(LOCALE_DATE_SEPARATOR_C);
  426.   locale.ShortDateFormat := dataset.Fields[LOCALE_SHORT_DATE_FORMAT_C].AsString;
  427.   locale.LongDateFormat := dataset.Fields[LOCALE_LONG_DATE_FORMAT_C].AsString;
  428.  
  429.   locale.TimeSeparator := GetChar(LOCALE_TIME_SEPARATOR_C);
  430.   locale.TimeAMString := dataset.Fields[LOCALE_TIME_AM_STRING_C].AsString;
  431.   locale.TimePMString := dataset.Fields[LOCALE_TIME_PM_STRING_C].AsString;
  432.   locale.TimeLeadingZeros := dataset.Fields[LOCALE_TIME_LEADING_ZEROS_C].AsInteger = 1;
  433.   locale.TimeFormat := TIvTimeFormat(dataset.Fields[LOCALE_TIME_FORMAT_C].AsInteger);
  434.  
  435.   if dataset.FieldCount > LOCALE_TIME_MARK_POSITION_C then
  436.     locale.TimeMarkPosition := TIvTimeMarkPosition(dataset.Fields[LOCALE_TIME_MARK_POSITION_C].AsInteger)
  437.   else
  438.   begin
  439.     locale.TimeMarkPosition := ivtmSuffix;
  440.     Result := True;
  441.   end;
  442.  
  443.   locale.CalendarType := TIvCalendarType(dataset.Fields[LOCALE_CALENDAR_TYPE_C].AsInteger);
  444.   locale.OptionalCalendarType := TIvCalendarType(dataset.Fields[LOCALE_OPTIONAL_CALENDAR_TYPE_C].AsInteger);
  445.   locale.FirstDayOfWeek := TIvDayOfWeek(dataset.Fields[LOCALE_FIRST_DAY_OF_WEEK_C].AsInteger);
  446.   locale.FirstWeekOfYear := TIvFirstWeekOfYear(dataset.Fields[LOCALE_FIRST_WEEK_OF_YEAR_C].AsInteger);
  447.  
  448.   for i := 1 to 12 do
  449.   begin
  450.     locale.ShortMonthNames[i] := dataset.Fields[LOCALE_SHORT_MONTH1_C + i - 1].AsString;
  451.     locale.LongMonthNames[i] := dataset.Fields[LOCALE_LONG_MONTH1_C + i - 1].AsString;
  452.   end;
  453.  
  454.   for i := 1 to 7 do
  455.   begin
  456.     locale.ShortDayNames[i] := dataset.Fields[LOCALE_SHORT_DAY1_C + i - 1].AsString;
  457.     locale.LongDayNames[i] := dataset.Fields[LOCALE_LONG_DAY1_C + i - 1].AsString;
  458.   end;
  459.  
  460.   locale.Init;
  461. end;
  462.  
  463. end.
  464.  
  465.